package com.zhenwei.zscm.job;

import cn.hutool.cron.CronUtil;
import cn.hutool.cron.task.Task;
import com.zhenwei.zscm.common.utils.Linq;
import com.zhenwei.zscm.model.dto.file.FileDTO;
import com.zhenwei.zscm.model.dto.file.FileRelationDTO;
import com.zhenwei.zscm.repo.FileRelationRepo;
import com.zhenwei.zscm.repo.FileRepo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

@Component
@Slf4j
public class ClearUnusedFileJob {
    @Autowired
    private FileRepo fileRepo;
    @Autowired
    private FileRelationRepo fileRelationRepo;

    public void run(){
        CronUtil.schedule("0 0 23 * * ?", (Task) () -> {
            log.info("开始执行清理文件任务...");
            List<FileDTO> unusedFiles = new ArrayList<>();
            List<FileRelationDTO> unusedFiles1 = fileRelationRepo.getUnusedFiles();
            if(Linq.isNotEmpty(unusedFiles1)){
                List<FileDTO> list = fileRepo.getList(Linq.select(unusedFiles1, FileRelationDTO::getFileId));
                unusedFiles.addAll(list);
            }
            // 删除这些文件
            if(Linq.isNotEmpty(unusedFiles)){
                unusedFiles.forEach(unusedFile -> {
                    try {
                        Files.delete(Path.of(unusedFile.getFilePath()));
                        log.info("无用文件已删除:{}", unusedFile);
                    } catch (IOException e) {
                        log.error("删除无用文件异常:{}",Arrays.toString(e.getStackTrace()));
                    }
                });
            }
            // 删除所有导入和导出的文件
            List<FileDTO> unrelatedFiles = fileRepo.getUnrelatedFiles();
            if(Linq.isNotEmpty(unrelatedFiles)){
                unrelatedFiles.forEach(importFile -> {
                    try {
                        if(Files.exists(Path.of(importFile.getFilePath()))){
                            Files.delete(Path.of(importFile.getFilePath()));
                            log.info("导入导出文件已删除:{}", importFile);
                            fileRepo.remove(importFile.getGuid());
                        }
                    } catch (IOException e) {
                        log.error("删除导入导出文件异常：{} {} {}", importFile, e, "");
                    }
                });
            }
        });
        CronUtil.start();
    }
}
